Le chiffrement asymétrique RSA
⚓︎
Le chiffrement asymétrique RSA
Ce système a été inventé en 1977 par trois mathématiciens R.Rivest, A.Shamir et L.Adleman,qui se sont inspirés des idées sur les échanges de clés contenues dans les travaux de Diffie et Hellman.
Regarder la vidéo:
I. Le codage RSA simplifié⚓︎
Le chiffrement RSA est asymétrique :
il utilise une paire de clés (des nombres entiers) composée:
-
d'une clé publique pour chiffrer.
-
d'une clé privée pour déchiffrer.
Les deux clés sont créées par une personne, souvent nommée par convention Alice, qui souhaite que lui soient envoyées des données confidentielles:
-
La clé publique est accessible à tous. Cette clé est utilisée par ses correspondants (Bob, etc.) pour chiffrer les données qui lui sont envoyées.
-
La clé privée est quant à elle réservée à Alice, et lui permet de déchiffrer ces données.
Une condition indispensable est qu'il soit « calculatoirement impossible » de déchiffrer à l'aide de la seule clé publique, en particulier de reconstituer la clé privée à partir de la clé publique, c'est-à-dire que les moyens de calcul disponibles et les méthodes connues au moment de l'échange (et le temps que le secret doit être conservé) ne le permettent pas.
Le chiffrement RSA est souvent utilisé pour communiquer une clé de chiffrement symétrique, qui permet alors de poursuivre l'échange de façon confidentielle :
Bob envoie à Alice une clé de chiffrement symétrique qui peut ensuite être utilisée par Alice et Bob pour échanger des données.
II. Génerer et utiliser une paire de clés (clé publique, clé privée)⚓︎
Prérequis d'arithmétique modulaire (maths expertes)
a. Les congruences
Exemple
Il est 22h, quelle heure sera-t-il 8h plus tard ?
Si vous avez répondu 6h (et pas 30h à la question précédente), vous venez de faire de l'arithmétique modulaire, en effet vous n'avez conservé que le reste de la division euclidienne par 24:
30 = 1 × 24 + 6 on écrira que 30 ≡ 6[24] et on lira 30 est égal à 6 modulo 24 ou 30 est congru à 6 modulo 24.
Vérifions que 53 ≡ 5[24]. En effet 53 = 2 × 24 +5
Question
a. Compléter : 103 ≡ ...[24]
b. Compléter : 13 ≡ ...[5]
c. Compléter : 42 ≡ ...[7]
Solution
a. 103 ≡ 7[24] car 103 = 4 × 24 + 7
b. 13 ≡ 3[5] car 13 = 2 × 5 + 3
c. 42 ≡ 0[7] car 42 = 6 × 7 + 0
b. Nombres premiers et nombres premiers entre eux
Question
Rappeler la définition d'un nombre premier. Les nombres suivants sont-ils premiers (justifier) : 12, 21, 29, 1 ?
Solution
Un nombre premier est un nombre qui a exactement deux diviseurs : 1 et lui même
- 12 n'est pas premier car en plus de 1 et 12, il a aussi comme diviseur 2
- 21 n'est pas premier car en plus de 1 et 21, il a aussi comme diviseur 3
- 29 est premier, il n'a que 1 et 29 comme diviseurs
- 1 n'est pas premier : il n'a qu'un seul diviseur : 1
Question
Rappeler la définition de nombres premiers entre eux.
- 12 et 5 sont-ils premiers entre eux?
- 33 et 27 sont-ils premiers entre eux?
Solution
On dit que deux nombres sont premiers entre eux lorsque leur PGCD vaut 1.
- 12 et 5 sont premiers entre eux
- 33 et 27 ne sont pas premiers entre eux car 33 = 11 × 3 et 27 = 9 × 3. Leur PGCD est égal à 3.
Voici comment générer et utiliser une paire de clés RSA (c'est à dire une clé publique et sa clé privée correspondante):
Étape 1:
Alice choisit 2 grands nombres premiers p et q. Dans la réalité ces nombres seront vraiment très grands (plus de 100 chiffres).
Dans notre exemple, nous prendrons p = 3 et q = 11.
Étape 2:
Alice multiplie ces deux nombres p et q et obtient ainsi un nombre n appelé module de déchiffrement: n = p×q
😊 Il est très facile pour Alice de calculer n en connaissant p et q.
😢 Il est extrêmement difficile pour Marc de faire le travail inverse : trouver p et q en connaissant n prend un temps exponentiel avec la taille de n.
C'est sur cette difficulté (appelée difficulté de factorisation) que repose la robustesse du système RSA.
Dans notre exemple, nous prendrons n = 3 × 11 = 33.
Étape 3 : Alice crée sa clé publique
On note le nombre f = (p−1)×(q−1). C'est l'indicatrice d'Euler.
Alice choisit un nombre e appelé exposant public(par exemple 3, 17, 257 ou 65537), qui doit être premier avec le nombre 𝑓 = (p−1)×(q−1).
Dans notre exemple, (p−1)×(q−1) = 20, Alice choisit donc e = 3. (mais elle aurait pu aussi choisir 7, 9, 13...).
Le couple (e, n) sera la clé publique d'Alice. Elle la diffuse à qui veut lui écrire.
Dans notre exemple, la clé publique d'Alice est (3, 33).
Étape 4 : Alice calcule sa clé privée
On trouve l'exposant privé d en calculant l'inverse de e modulo f, c'est-à-dire que le reste de la division euclidienne de e × d par 𝑓 soit égal à 1.
Alice calcule maintenant sa clé privée : elle doit trouver un nombre qui vérifie l'égalité e × d ≡ 1[𝑓]
Dans notre exemple, comme 7 × 3 ≡ 1[20], ce nombre d est égal à 7.
Le couple (d, n) sera la clé privée d'Alice. Elle ne la diffuse à personne.
Dans notre exemple, la clé privée d'Alice est (7, 33).
Étape 5 : Bob envoie un message chiffré à Alice avec la clé publique d'Alice
Supposons que Bob veuille écrire à Alice pour lui envoyer le nombre 4. Il possède la clé publique d'Alice, qui est (3, 33).
Il calcule donc 43 modulo 33, qui vaut 31. C'est cette valeur 31 qu'il transmet à Alice.
43 ≡ 31[33]
>>> (4**3) % 33
31
Étape 6 : Alice déchiffre le message envoyé par Bob avec sa clé privée
Alice reçoit la valeur 31. Il lui suffit alors d'élever 31 à la puissance 7 (sa clé privée), et de calculer le reste modulo 33
317 = 27512614111
27512614111 ≡ 4[33]
>>> (31**7) % 33
4
Elle récupère la valeur 4, qui est bien le message original de Bob.
clé privée et clé publique
-
Le couple (e, n) constitue la clé publique.
-
Le couple (d, n) constitue la clé privée.
Questions:
Alice veut écrire à Bob. Soit le couple de nombre premiers (p, q) avec p = 5 et q = 13.
- Calculer n et 𝑓.
- n = 5 × 13 = 65
- 𝑓 = 4 × 12 = 48
- Justifier que (9, 65) ne peut pas être une clé publique.
- Vérifier que (11, 65) est une clé publique. C'est la clé publique de Bob
- Vérifier que 35 est un inverse de 11 modulo 48.
- En déduire la clé privée de Bob.
- Chiffrer le nombre secret d'Alice 17 avec la clé publique de Bob. C'est ce nombre qu'Alice envoie à Bob
- Déchiffrer le nombre reçu par Bob.
Solution:
Solution:
Pour que (e, n) soit une clé publique, il faut que e et 𝑓 soient premiers entre eux. Or le PGCD de 9 et 48 est 3.
9 et 48 ne sont donc pas premiers entre eux.
Solution:
Pour que (e, n) soit une clé publique, il faut que e et 𝑓 soient premiers entre eux. Or le PGCD de 11 et 48 est 1. 11 et 48 sont donc premiers entre eux. On peut donc choisir (11, 65) comme clé publique.
Solution:
35 × 11 = 385. Or 385 = 8 × 48 + 1 Donc 35 × 11≡ 1[48] On dit que 35 est un inverse de 11 modulo 48.
>>> 385 % 48
1
Solution:
La clé privée de Bob est donc (35, 65).
Solution:
>>> (17**11) % 65
23
Solution:
Bob doit déchiffrer 23. Pour cela il utilise sa clé privée qui (35, 65) :
>>> (23**35) % 65
17
III. Envoyer un message avec la clé publique⚓︎
Pour coder la phrase "Bienvenue au LDM"
, on utilise la fonction ord
pour connaitre le code Unicode de chaque caractère :
Exécuter le script ci-dessous:
Puis nous coderons chaque lettre l'une après l'autre.
Par exemple pour la deuxième lettre i : 105
.
La lettre i
sera donc codée par le nombre \(105^{e}\) % n
Note: On utilisera la fonction pow
. On pourrait aussi écrire \(105^{e}\) % n mais plus tard on utilisera des grands nombres et seule la fonction pow
sera assez efficace pour cela.
Exécuter le script ci-dessous:
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Compléter le script ci-dessous:
La fonction renverra une chaîne de caractères contenant les nombres codés, séparés par un espaces " ".
On prendra garde à enlever le dernier caractère s'il s'agit d'un espace.
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Cryptez le mot "Spécialité"
avec la clé publique (e, n) = (23, 3128548201)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
IV. Déchiffrer un message avec la clé privée⚓︎
On obtient le message décrypté en calculant le reste de la division euclidienne de \(c^d\) par \(n\): (\(c^d\) % n)
Note: On utilisera la fonction pow
. On pourrait aussi écrire \(c^{d}\) % n mais plus tard on utilisera des grands nombres et seule la fonction pow
sera assez efficace pour cela.
Exécuter le script ci-dessous:
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
On pourra utiliser la méthode split
:
Exécuter le script ci-dessous:
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Compléter le script ci-dessous:
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Decryptez le mot "Spécialité"
que vous avez crypté précedemment, avec la clé privée (d, n) = (544075879, 3128548201)
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
V. Casser des clés RSA⚓︎
Voici un code qui permet de décomposer un nombre entier \(n\) en deux facteurs :
- si n est premier alors la fonction renvoie le couple
(1, n)
- sinon la fonction renvoie un couple
(p, q)
tel que \(1<p<=q\) et \({p}\times{q}=n\)
Exécuter le script ci-dessous:
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Quelques commentaires sur cet algorithme:
- Dans un premier temps, on a traité les cas particuliers
n=2
etn=3
. - Ensuite on remarque qui si \(n\) est pair, la fonction peut renvoyer le couple
(2, n//2)
. - Pour les nombres impairs, il suffit donc de tester la division de \(n\) par les nombres impairs : 3, 5 , 7 ...
Une fois qu'on a trouvé p et q, on peut trouver f et donc d.
Voici un code qui permet de calculer l'inverse de e modulo f:
Exécuter le script ci-dessous:
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Compléter le script ci-dessous:
Vous utiliserez les fonctions produit
et inverse_modulaire
.
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)
Sécurité du codage RSA
Mais alors ... est-ce que la signature RSA est sécurisée ou pas ? On vient de casser une clé RSA, après tout ! La réponse est : RSA est sécurisé quand on utilise des clés assez grandes. Quand on génère des clés RSA avec des nombres p et q suffisamment grand (donc n est grand aussi), les opérations que doivent effectuer les « gentils » (signature et vérification) sont un peu plus longues à effectuer.
Mais les opérations nécessaires pour casser une clé RSA (en gros, la factorisation de n) demandent, elles, beaucoup plus de temps.
On remarque que, si ce temps est très court pour de petits nombres (à 3 chiffres), il devient vite important pour des grands nombres. En fait ces nombres n'ont pas été choisis au hasard : ils sont formés du produit de deux nombres premiers.
Voilà donc pourquoi casser de véritables clés RSA n'est pas aussi simple que ce que l'on vient de voir, et pourquoi RSA est en fait sécurisé: quand la puissance de calcul des ordinateurs augmente tellement que casser les clés actuelles risque de devenir faisable, on augmente très légèrement la taille des clés: RSA devient légèrement plus long à utiliser mais beaucoup plus difficile à casser.
Pour information, la taille de clé recommandée aujourd'hui pour RSA est d'avoir un n de ... 2048 bits minimum.
Nous avons donc la une fonction à sens unique :
- il est très facile de calculer le produit de deux nombres premiers.
- il est difficile (voir impossible en un temps raisonnable), dès que ces nombres sont grands, de décomposer ce produit en deux facteurs de nombres premiers. Le temps que prend cette factorisation croît exponentiellement avec la longueur de la clé.
BILAN
Il faut enfin réaliser une fiche de cours (sur une feuille simple) en faisant apparaitre les notions importantes de ce cours :
-
Connaitre le principe des chiffrements asymétriques.
-
Connaitre le principe du codage RSA.
# Tests
(insensible à la casse)(Ctrl+I)
(Alt+: ; Ctrl pour inverser les colonnes)
(Esc)